<!DOCTYPE html>
<html lang="en">

<head>
	<meta http-equiv="content-type" content="text/html; charset=utf-8">
	<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport">
	
	<!-- title -->
	
	<title>
	
		日志在项目中的地位 | 
	 
	对线面试官
	</title>
	
	<!-- keywords,description -->
	 
		<meta name="description" content="Java一线大厂面试" />
	

	<!-- favicon -->
	
	<link rel="shortcut icon" href="/luffy/favicon.ico">
	


	<!-- search -->
	<script>
		var searchEngine = "https://www.baidu.com/s?wd=";
		if(typeof searchEngine == "undefined" || searchEngine == null || searchEngine == ""){
			searchEngine = "https://www.google.com/search?q=";
		}
		var homeHost = "";
		if(typeof homeHost == "undefined" || homeHost == null || homeHost == ""){
			homeHost = window.location.host;
		}
	</script>


	
<link rel="stylesheet" href="/luffy/css/main.css">

	
<link rel="stylesheet" href="https://cdn.staticfile.org/font-awesome/4.7.0/css/font-awesome.min.css">

	
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@9.17.1/build/styles/darcula.min.css">

	
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/fancyapps/fancybox@3.5.7/dist/jquery.fancybox.min.css">


	
<script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.min.js"></script>

	
<script src="https://cdn.jsdelivr.net/gh/fancyapps/fancybox@3.5.7/dist/jquery.fancybox.min.js"></script>

	
<script src="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@9.17.1/build/highlight.min.js"></script>

	
<script src="https://cdn.jsdelivr.net/npm/jquery-pjax@2.0.1/jquery.pjax.min.js"></script>

	
<script src="/luffy/js/main.js"></script>

	
		
<script src="https://cdn.jsdelivr.net/npm/leancloud-storage/dist/av-min.js"></script>

		
<script src="https://cdn.jsdelivr.net/npm/valine@1.3.10/dist/Valine.min.js"></script>

	
	
<meta name="generator" content="Hexo 5.4.0"></head>

<body>
	<script>
var _hmt = _hmt || [];
(function() {
  var hm = document.createElement("script");
  hm.src = "https://hm.baidu.com/hm.js?3efe99c287df5a1d6f0d02d187e403c1";
  var s = document.getElementsByTagName("script")[0]; 
  s.parentNode.insertBefore(hm, s);
})();
</script>

<header id="header">
    <a id="title" target="_blank" rel="noopener" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzU4NzA3MTc5Mg==&action=getalbum&album_id=1657204970858872832&scene=126#wechat_redirect" class="logo">对线面试官</a>

	<ul id="menu">
		
	

	

		<li class="menu-item">
			<a href="https://gitee.com/zhongfucheng/Java3y" class="menu-item-link" target="_blank">
				【戳这里】获取更多原创干货💪💪
			</a>
		</li>
		<li class="menu-item">
			<a href="https://gitee.com/zhongfucheng/Java3y" class="menu-item-link" target="_blank">
				<i class="fa fa-github fa-2x"></i>
			</a>
		</li>
	</ul>
</header>

	
<div id="sidebar">
	<button id="sidebar-toggle" class="toggle" ><i class="fa fa-arrow-right " aria-hidden="true"></i></button>
	
	<div id="site-toc">
		<input id="search-input" class="search-input" type="search" placeholder="按回车全站搜索">
		<div id="tree">
			

			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										00-面试前准备
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/10/30/00-%E9%9D%A2%E8%AF%95%E5%89%8D%E5%87%86%E5%A4%87/01.%E7%AE%80%E5%8E%86/">
										01.简历
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										01-Java基础
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/01-Java%E5%9F%BA%E7%A1%80/01.%20%E6%B3%A8%E8%A7%A3/">
										01. 注解
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/01-Java%E5%9F%BA%E7%A1%80/02.%20%E6%B3%9B%E5%9E%8B/">
										02. 泛型
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/01-Java%E5%9F%BA%E7%A1%80/03.%20JavaNIO/">
										03. JavaNIO
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/01-Java%E5%9F%BA%E7%A1%80/04.%20%E5%8F%8D%E5%B0%84%E5%92%8C%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86/">
										04. 反射和动态代理
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										02-Java并发
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/02-Java%E5%B9%B6%E5%8F%91/01.%20%E5%A4%9A%E7%BA%BF%E7%A8%8B%E5%9F%BA%E7%A1%80/">
										01. 多线程基础
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/02-Java%E5%B9%B6%E5%8F%91/02.%20CAS/">
										02. CAS
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/02-Java%E5%B9%B6%E5%8F%91/03.%20synchronized/">
										03. synchronized
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/02-Java%E5%B9%B6%E5%8F%91/04.%20AQS%E5%92%8CReentrantLock/">
										04. AQS和ReentrantLock
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/02-Java%E5%B9%B6%E5%8F%91/05.%20%E7%BA%BF%E7%A8%8B%E6%B1%A0/">
										05. 线程池
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/02-Java%E5%B9%B6%E5%8F%91/06.%20ThreadLocal/">
										06. ThreadLocal
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/02-Java%E5%B9%B6%E5%8F%91/07.%20CountDownLatch%E5%92%8CCyclicBarrier/">
										07. CountDownLatch和CyclicBarrier
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/02-Java%E5%B9%B6%E5%8F%91/08.%20%E4%B8%BA%E4%BB%80%E4%B9%88%E9%9C%80%E8%A6%81Java%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8B/">
										08. 为什么需要Java内存模型
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/02-Java%E5%B9%B6%E5%8F%91/09.%20%E6%B7%B1%E5%85%A5%E6%B5%85%E5%87%BAJava%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8B/">
										09. 深入浅出Java内存模型
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										03-Java容器
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/03-Java%E5%AE%B9%E5%99%A8/01.%20List%E9%9B%86%E5%90%88/">
										01. List集合
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/03-Java%E5%AE%B9%E5%99%A8/02.%20Map%E9%9B%86%E5%90%88/">
										02. Map集合
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										04-Java虚拟机
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/04-Java%E8%99%9A%E6%8B%9F%E6%9C%BA/01.%20Java%E7%BC%96%E8%AF%91%E5%88%B0%E6%89%A7%E8%A1%8C%E7%9A%84%E8%BF%87%E7%A8%8B/">
										01. Java编译到执行的过程
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/04-Java%E8%99%9A%E6%8B%9F%E6%9C%BA/02.%20%E5%8F%8C%E4%BA%B2%E5%A7%94%E6%B4%BE%E6%9C%BA%E5%88%B6/">
										02. 双亲委派机制
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/04-Java%E8%99%9A%E6%8B%9F%E6%9C%BA/03.%20JVM%E5%86%85%E5%AD%98%E7%BB%93%E6%9E%84/">
										03. JVM内存结构
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/04-Java%E8%99%9A%E6%8B%9F%E6%9C%BA/04.%20%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E6%9C%BA%E5%88%B6/">
										04. 垃圾回收机制
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/20/04-Java%E8%99%9A%E6%8B%9F%E6%9C%BA/05.%20CMS%E5%9E%83%E5%9C%BE%E6%94%B6%E9%9B%86%E5%99%A8/">
										05. CMS垃圾收集器
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/20/04-Java%E8%99%9A%E6%8B%9F%E6%9C%BA/06.%20G1%E5%9E%83%E5%9C%BE%E6%94%B6%E9%9B%86%E5%99%A8/">
										06. G1垃圾收集器
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/24/04-Java%E8%99%9A%E6%8B%9F%E6%9C%BA/07.%20JVM%E8%B0%83%E4%BC%98/">
										07. JVM调优
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										05-Spring
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/05-Spring/01.%20SpringMVC/">
										01. SpringMVC
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/05-Spring/02.%20Spring%E5%9F%BA%E7%A1%80/">
										02. Spring基础
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/05-Spring/03.%20SpringBean%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F/">
										03. SpringBean生命周期
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										06-Redis
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/06-Redis/01.%20Redis%E5%9F%BA%E7%A1%80/">
										01. Redis基础
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/06-Redis/02.%20Redis%E6%8C%81%E4%B9%85%E5%8C%96/">
										02. Redis持久化
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/20/06-Redis/03.%20Redis%E4%B8%BB%E4%BB%8E%E6%9E%B6%E6%9E%84/">
										03. Redis主从架构
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/20/06-Redis/04.%20Redis%E5%88%86%E7%89%87%E9%9B%86%E7%BE%A4/">
										04. Redis分片集群
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										07-消息队列
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/07-%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97/01.%20Kafka%E5%9F%BA%E7%A1%80/">
										01. Kafka基础
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/07-%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97/02.%20%E4%BD%BF%E7%94%A8Kafka%E4%BC%9A%E8%80%83%E8%99%91%E4%BB%80%E4%B9%88%E9%97%AE%E9%A2%98/">
										02. 使用Kafka会考虑什么问题
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										08-MySQL
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/08-MySQL/01.%20MySQL%E7%B4%A2%E5%BC%95/">
										01. MySQL索引
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/08-MySQL/02.%20MySQL%E4%BA%8B%E5%8A%A1%E5%92%8C%E9%94%81%E6%9C%BA%E5%88%B6%E5%92%8CMVCC/">
										02. MySQL事务和锁机制和MVCC
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/08-MySQL/03.%20MySQL%E8%B0%83%E4%BC%98/">
										03. MySQL调优
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										09-项目场景类
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/20/09-%E9%A1%B9%E7%9B%AE%E5%9C%BA%E6%99%AF%E7%B1%BB/01.%20%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E5%8E%BB%E9%87%8D%E5%92%8C%E5%B9%82%E7%AD%89/">
										01. 如何实现去重和幂等
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/20/09-%E9%A1%B9%E7%9B%AE%E5%9C%BA%E6%99%AF%E7%B1%BB/02.%20%E7%B3%BB%E7%BB%9F%E9%9C%80%E6%B1%82%E5%A4%9A%E5%8F%98%E5%A6%82%E4%BD%95%E8%AE%BE%E8%AE%A1/">
										02. 系统需求多变如何设计
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/20/09-%E9%A1%B9%E7%9B%AE%E5%9C%BA%E6%99%AF%E7%B1%BB/03.%20%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/">
										03. 设计模式
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										10-计算机网络
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/25/10-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/01.%20HTTP/">
										01. HTTP
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/10/13/10-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/02.TCP%E4%B8%89%E6%AC%A1%E6%8F%A1%E6%89%8B%E5%92%8C%E5%9B%9B%E6%AC%A1%E6%8C%A5%E6%89%8B/">
										02.TCP三次握手和四次挥手
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										11-算法
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/09/01/11-%E7%AE%97%E6%B3%95/01.%20%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95/">
										01. 排序算法
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/09/02/11-%E7%AE%97%E6%B3%95/02.%20LeetCode%20Easy/">
										02. LeetCode Easy
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/09/02/11-%E7%AE%97%E6%B3%95/02.%20LeetCode%20Medium/">
										02. LeetCode Medium
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										12-austin项目
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/11/01/12-austin%E9%A1%B9%E7%9B%AE/00.%E9%A1%B9%E7%9B%AE%E4%BB%8B%E7%BB%8D/">
										00.项目介绍
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/10/30/12-austin%E9%A1%B9%E7%9B%AE/01.%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/">
										01.环境搭建
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file active">
									<a href="/luffy/2021/10/30/12-austin%E9%A1%B9%E7%9B%AE/02.%E6%97%A5%E5%BF%97/">
										02.日志
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/11/24/12-austin%E9%A1%B9%E7%9B%AE/03.%E5%B7%A5%E5%85%B7%E5%8C%85/">
										03.工具包
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/11/24/12-austin%E9%A1%B9%E7%9B%AE/04.%E4%BB%8E%E4%B8%80%E6%9D%A1%E7%9F%AD%E4%BF%A1%E5%BC%80%E5%A7%8B/">
										04.从一条短信开始
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/11/24/12-austin%E9%A1%B9%E7%9B%AE/05.%E9%80%89%E6%8B%A9%E6%95%B0%E6%8D%AE%E5%BA%93%E5%92%8C%E6%8A%80%E6%9C%AF%E9%80%89%E5%9E%8B/">
										05.选择数据库和技术选型
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/11/24/12-austin%E9%A1%B9%E7%9B%AE/06.MySQL%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/">
										06.MySQL环境搭建
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/11/24/12-austin%E9%A1%B9%E7%9B%AE/07.Kafka%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/">
										07.Kafka环境搭建
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
		</div>
	</div>
</div>

	<!-- 引入正文 -->
	<div id="content">
		<h1 id="article-title">

	02.日志
</h1>
<div class="article-meta">
	
	<span>3y</span>
	<span>2021-10-30 16:23:29</span>
		<div id="article-categories">
    
		<span>Categories：</span>
            
    

    
		<span>Tags：</span>
            
    
		</div>

</div>

<div id="article-content">
	<p><a target="_blank" rel="noopener" href="https://mp.weixin.qq.com/s?__biz=MzI4Njg5MDA5NA==&mid=2247501926&idx=1&sn=9fd2996baa50ce04c3569c490e15299c&chksm=ebd48967dca30071126d6d1d3f5eb08cf8a0d818a3c951c7dcc6bedb3c124f3d0c5166622379&token=358461825&lang=zh_CN#rd">第零篇</a>简单介绍了austin项目做什么用的，这两个月我重点会实现哪一块内容。</p>
<p><a target="_blank" rel="noopener" href="https://mp.weixin.qq.com/s?__biz=MzI4Njg5MDA5NA==&mid=2247501892&idx=1&sn=9352f83e2a15003fb5ea61b83c569680&chksm=ebd48945dca3005371df9858c9347cea95b7a1424eb290659b781d3e07704b3207a3fce5126d&token=358461825&lang=zh_CN#rd">第一篇</a>用Maven+SpringBoot搭好了项目的架子，以及聊了下我对SpringBoot和Maven的看法。</p>
<p>总的来说，我感觉这次的反响是不错的，虽然阅读量不高。但留言的人多了很多，也有很多人都担心我会不会鸽掉（更新一半中途就断了）</p>
<p>我只能说：别慌，绝对不鸽，<strong>你只管追更就好</strong>。</p>
<p><img src="https://tva1.sinaimg.cn/large/008i3skNgy1gvxfvs4sdwj30m0066mxb.jpg"></p>
<p>我已经决定每个周末都扛着电脑回家，有空就往附近的图书馆里跑（图书馆是学习的YYDS，在家的效率就是要比图书馆要低不少）</p>
<p>不多BB了，今天继续聊个话题：<strong>日志</strong></p>
<h2 id="01、什么是日志"><a href="#01、什么是日志" class="headerlink" title="01、什么是日志"></a>01、什么是日志</h2><p>所谓日志，在我理解下就是：<strong>记录程序运行时的信息</strong></p>
<p><img src="https://tva1.sinaimg.cn/large/008i3skNgy1gvxfy1cxn2j30pq07g74l.jpg"></p>
<p>在Java最初期又或是我们初学阶段，打印日志全凭<code>System.out.println();</code></p>
<p>这好用吗？有待商榷。</p>
<p>对于大部分初学者来说，好用！我想看的信息，直接在<code>console</code>就能看到了，这是多么地方便阿。学习Java的第一个运行结果都是由<code>System.out.println();</code>出来的，不需要有任何的学习成本。</p>
<p>对于大部分工作者来说，本地调试可以，但如果程序部署到服务器以后，那就算了。</p>
<p>生产环境跟本地环境是有区别的：</p>
<ul>
<li>生产环境需要记录的日志会更多（毕竟是作为一个系统/项目在线上运行，不可能只打印一点点内容）</li>
<li>生产环境的日志内容需要保留至文件（作为留存，线上不会说第一时间发现问题，很多需要查找历史日志数据）</li>
<li>生产环境的日志内容需要有一定的规范格式（至少日志记录的时间需要有吧）</li>
<li>…</li>
</ul>
<p>上面这些要求，<code>System.out.println();</code>都是不具备的。</p>
<p>所以，我们可以看到在公司里写的项目，是没有用<code>System.out.println();</code>记录日志的</p>
<p><img src="https://tva1.sinaimg.cn/large/008i3skNgy1gvxfxtmy4ij30ps0aiwf7.jpg"></p>
<h2 id="02、Java日志体系"><a href="#02、Java日志体系" class="headerlink" title="02、Java日志体系"></a>02、Java日志体系</h2><p>工作了以后，你会发现每次引入一个框架，这个框架下几乎都有对应的日志包。</p>
<p>我之前在公司里曾经整合过几个项目（将原有的几个工程合并到一个项目内）。</p>
<p>系统分久必合合久必分，当时是认为以前的同事把项目拆得过于细，造成一定的资源浪费（毕竟每个工程跑在线上至少都会部署两台线上机器），所以有段时间公司就希望我们把一些细小的项目进行合并。</p>
<p>至于这做得对与错，这块我就不谈了。</p>
<p>在合并的过程中，最最最麻烦的就是解决依赖冲突的问题（都是Maven项目，会有Maven仲裁的问题），而这里边，最明显的就是Java日志包的问题。</p>
<p>如果你有那么一丢丢了解Java日志，你就应该多多少少听说过以下的名字：<strong>Log4j</strong>(log for java)、<strong>JUL</strong>(Java Util Logging)、<strong>JCL</strong>(Jakarta Commons Logging)、<strong>Slf4j</strong>(Simple Logging Facade for Java)、<strong>Logback</strong>、<strong>Log4j2</strong></p>
<p><img src="https://tva1.sinaimg.cn/large/008i3skNgy1gvxfzm6yadj31i206yaaj.jpg"></p>
<p>如果你比较细心，你会发现，不同的技术框架所采用的Java日志实现都很有可能不一样的。</p>
<p>既然实现不一样，那对应的API调用是不是就不一样？（毕竟它还不像是JDBC，定义了一套接口规范，各个数据库厂商去实现JDBC规范，程序员面向JDBC接口编程就完事了）</p>
<p>那这这这不是乱套呢？想到这里，血压就逐渐就上来了？这别慌，上面提到的Java日志<strong>Slf4j</strong>(Simple Logging Facade for Java)干的就类似JDBC做的事情。</p>
<p>它定义了日志的接口（门面模式），当项目使用别的日志框架时，那就适配它！（注意：JDBC是定义接口，数据库厂商实现。Slf4j也定义了接口，但是它适配其他的Java日志实现，骚不骚？）</p>
<p>我们看Slf4j官网的一张图，应该就挺好理解了：</p>
<p><img src="https://tva1.sinaimg.cn/large/008i3skNgy1gvx9cuoubmj30w00hodki.jpg"></p>
<p>扯了这么久，我想表达的是：我们在项目中，最好是使用Slf4j提供的API，至于真实的LOG实现，都可以用<strong>Slf4j进行桥接</strong>（这样一来，或许将来有一天说要从log4j改为logback，那程序代码也不用改动）</p>
<h2 id="03、日志有什么用"><a href="#03、日志有什么用" class="headerlink" title="03、日志有什么用?"></a>03、日志有什么用?</h2><p>还没有过生产环境的开发的同学可能认为记录日志就是用来<strong>定位问题</strong>的，其实并不完全是。</p>
<p>日志一方面我们用它来定位问题，一方面我们<strong>很多的数据也是来源于日志</strong></p>
<p>不要觉得存在数据库里的数据才是重要的，我们<strong>程序运行时记录下的日志数据也同样重要</strong>。</p>
<p>在大数据领域里，数据来源有很多：关系型数据库、爬虫、日志等等</p>
<p><img src="https://tva1.sinaimg.cn/large/008i3skNgy1gvxag02d2ij31840hg3zl.jpg"></p>
<p>举个例子，我以前的公司就有处理日志的一套框架：</p>
<ol>
<li>我们正常把日志信息输出到文件下</li>
<li>框架提供后台给予我们配置（文件的路径以及Kafka Topic Name）</li>
</ol>
<p>该框架做的事情说白了就是：把我们的日志文件内容转成Kafka消息（如果使用方需要将哪个日志文件的内容转为MQ消息，那在平台上配置下就完事了）</p>
<p>有了Kafka消息，那配合流式处理平台（Storm/Spark/Flink）再对日志进行清洗，是不是就能产生<strong>有价值的数据</strong></p>
<p><img src="https://tva1.sinaimg.cn/large/008i3skNgy1gvxaq825i5j31m20nijtq.jpg"></p>
<h2 id="04、Austin-日志"><a href="#04、Austin-日志" class="headerlink" title="04、Austin 日志"></a>04、Austin 日志</h2><p>扯了这么久的日志基础，只是想让还不了解日志的同学有个认知。</p>
<p>不扯别的了，还是回到我们还在「新建文件夹」阶段的austin项目吧。</p>
<p>austin项目的搭建技术框架使用的是SpringBoot，SpringBoot默认的日志组合是：<code>Slf4j + logback</code></p>
<p>我在公司接触到的项目几乎都是这个组合，所以我就不打算动了，就直接用<code>logback</code>作为austin的日志实现框架了（要是真有那么一天要改成别的日志实现，理论上只要引入对应的桥接包就完事了）。</p>
<h2 id="05、logback日志初体验"><a href="#05、logback日志初体验" class="headerlink" title="05、logback日志初体验"></a>05、logback日志初体验</h2><p>在无任何配置的前提下，只要我们引入了SpringBoot的包，就能直接使用日志的功能了。具体效果入下图</p>
<p><img src="https://tva1.sinaimg.cn/large/008i3skNgy1gvxbg5nvv4j31c70u0tjf.jpg"></p>
<p>SpringBoot是<strong>约定大于配置</strong>的一个框架</p>
<blockquote>
<p>SpringBoot会默认去加载resources下名为**logback.xml **或者 <strong>logback-spring.xml</strong>的配置文件（ xml 格式也可以改为 groovy 格式）</p>
<p>如果都不存在，那么 logback 默认地会调用<strong>BasicConfigurator</strong> ，创建一个最小化配置。</p>
<p>最小化配置由一个关联到根 logger 的ConsoleAppender 组成。输出用模式为**%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n** 的 PatternLayoutEncoder 进行格式化</p>
</blockquote>
<p><img src="https://tva1.sinaimg.cn/large/008i3skNgy1gvxbwkfk4nj30zm0u0wi7.jpg"></p>
<h2 id="06、logback配置"><a href="#06、logback配置" class="headerlink" title="06、logback配置"></a>06、logback配置</h2><p>从上面可以发现的是，默认的logback配置是不符合我们的要求的（它是打印在console的），我们是希望把日志记录在文件下的。</p>
<p>所以，我们会在<code>resources</code>下新建一个<code>logback</code>配置。常见的配置内容如下：</p>
<pre><code class="xml">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;

&lt;configuration scan=&quot;true&quot; scanPeriod=&quot;10 seconds&quot;&gt;

    &lt;contextName&gt;austin&lt;/contextName&gt;

    &lt;!-- 设置日志输出路径  可以使“$&#123;&#125;”来使用变量。TODO 这里后面是需要读配置的 --&gt;
    &lt;property name=&quot;log.path&quot; value=&quot;logs&quot;/&gt;


    &lt;appender name=&quot;CONSOLE&quot; class=&quot;ch.qos.logback.core.ConsoleAppender&quot;&gt;
        &lt;encoder class=&quot;ch.qos.logback.classic.encoder.PatternLayoutEncoder&quot;&gt;
            &lt;!--格式化输出：%d表示日期，%thread表示线程名，%-5level：级别从左显示5个字符宽度%msg：日志消息，%n是换行符--&gt;
            &lt;pattern&gt;%d&#123;yyyy-MM-dd HH:mm:ss.SSS&#125; [%thread] %-5level %logger&#123;50&#125; - %msg%n&lt;/pattern&gt;
            &lt;!-- 设置字符集 --&gt;
            &lt;charset&gt;UTF-8&lt;/charset&gt;
        &lt;/encoder&gt;
    &lt;/appender&gt;


    &lt;!-- 时间滚动输出 level为 INFO 日志 --&gt;
    &lt;appender name=&quot;INFO_FILE&quot; class=&quot;ch.qos.logback.core.rolling.RollingFileAppender&quot;&gt;
        &lt;!-- 正在记录的日志文件的路径及文件名 --&gt;
        &lt;file&gt;$&#123;log.path&#125;/austin-info.log&lt;/file&gt;
        &lt;!--日志文件输出格式--&gt;
        &lt;encoder&gt;
            &lt;pattern&gt;%d&#123;yyyy-MM-dd HH:mm:ss.SSS&#125; [%thread] %-5level %logger&#123;50&#125; - %msg%n&lt;/pattern&gt;
            &lt;charset&gt;UTF-8&lt;/charset&gt;
        &lt;/encoder&gt;
        &lt;!-- 日志记录器的滚动策略，按日期，按大小记录 --&gt;
        &lt;rollingPolicy class=&quot;ch.qos.logback.core.rolling.TimeBasedRollingPolicy&quot;&gt;
            &lt;!-- 每天日志归档路径以及格式 --&gt;
            &lt;fileNamePattern&gt;$&#123;log.path&#125;/logs/austin-info-%d&#123;yyyy-MM-dd&#125;.%i.log&lt;/fileNamePattern&gt;
            &lt;timeBasedFileNamingAndTriggeringPolicy class=&quot;ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP&quot;&gt;
                &lt;maxFileSize&gt;1000MB&lt;/maxFileSize&gt;
            &lt;/timeBasedFileNamingAndTriggeringPolicy&gt;
            &lt;!--日志文件保留天数--&gt;
            &lt;maxHistory&gt;15&lt;/maxHistory&gt;
        &lt;/rollingPolicy&gt;
        &lt;!-- 此日志文件只记录info级别的 --&gt;
        &lt;filter class=&quot;ch.qos.logback.classic.filter.LevelFilter&quot;&gt;
            &lt;level&gt;info&lt;/level&gt;
            &lt;onMatch&gt;ACCEPT&lt;/onMatch&gt;
            &lt;onMismatch&gt;DENY&lt;/onMismatch&gt;
        &lt;/filter&gt;
    &lt;/appender&gt;

    &lt;!-- 时间滚动输出 level为 ERROR 日志 --&gt;
    &lt;appender name=&quot;ERROR_FILE&quot; class=&quot;ch.qos.logback.core.rolling.RollingFileAppender&quot;&gt;
        &lt;!-- 正在记录的日志文件的路径及文件名 --&gt;
        &lt;file&gt;$&#123;log.path&#125;/austin-error.log&lt;/file&gt;
        &lt;!--日志文件输出格式--&gt;
        &lt;encoder&gt;
            &lt;pattern&gt;%d&#123;yyyy-MM-dd HH:mm:ss.SSS&#125; [%thread] %-5level %logger&#123;50&#125; - %msg%n&lt;/pattern&gt;
            &lt;charset&gt;UTF-8&lt;/charset&gt; &lt;!-- 此处设置字符集 --&gt;
        &lt;/encoder&gt;
        &lt;!-- 日志记录器的滚动策略，按日期，按大小记录 --&gt;
        &lt;rollingPolicy class=&quot;ch.qos.logback.core.rolling.TimeBasedRollingPolicy&quot;&gt;
            &lt;fileNamePattern&gt;$&#123;log.path&#125;/austin-error-%d&#123;yyyy-MM-dd&#125;.%i.log&lt;/fileNamePattern&gt;
            &lt;timeBasedFileNamingAndTriggeringPolicy class=&quot;ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP&quot;&gt;
                &lt;maxFileSize&gt;1000MB&lt;/maxFileSize&gt;
            &lt;/timeBasedFileNamingAndTriggeringPolicy&gt;
            &lt;!--日志文件保留天数--&gt;
            &lt;maxHistory&gt;15&lt;/maxHistory&gt;
        &lt;/rollingPolicy&gt;
        &lt;!-- 此日志文件只记录ERROR级别的 --&gt;
        &lt;filter class=&quot;ch.qos.logback.classic.filter.LevelFilter&quot;&gt;
            &lt;level&gt;ERROR&lt;/level&gt;
            &lt;onMatch&gt;ACCEPT&lt;/onMatch&gt;
            &lt;onMismatch&gt;DENY&lt;/onMismatch&gt;
        &lt;/filter&gt;
    &lt;/appender&gt;

    &lt;root level=&quot;info&quot;&gt;
        &lt;!-- TODO console打印后面可以只针对dev环境的 --&gt;
        &lt;appender-ref ref=&quot;CONSOLE&quot;/&gt;
        &lt;appender-ref ref=&quot;INFO_FILE&quot;/&gt;
        &lt;appender-ref ref=&quot;ERROR_FILE&quot;/&gt;
    &lt;/root&gt;

&lt;/configuration&gt;
</code></pre>
<p><img src="https://tva1.sinaimg.cn/large/008i3skNgy1gvxcs9yq5jj31c10u0gwc.jpg"></p>
<p>日志的配置不会是一成不变的，现在项目刚搭建出来，就怎么简单怎么来。</p>
<h2 id="07、彩蛋"><a href="#07、彩蛋" class="headerlink" title="07、彩蛋"></a>07、彩蛋</h2><p>这篇文章发布的前一个晚上，ZhenDong突然问我现在用的什么MQ比较多，我随口一答：Kafka吧，我接触MQ基本都是Kafka</p>
<p>他说在写一个<strong>好东西</strong>，到时候发出来。我这一听，就肯定感兴趣了啊。</p>
<p><img src="https://tva1.sinaimg.cn/large/008i3skNgy1gw288vj1syj30wu0u0adr.jpg"></p>
<p>ZhenDong发的文章链接：<a target="_blank" rel="noopener" href="https://mp.weixin.qq.com/s/JC51S_bI02npm4CE5NEEow">https://mp.weixin.qq.com/s/JC51S_bI02npm4CE5NEEow</a></p>
<p>文章大概就是美团大佬们他们用<strong>AOP+动态模板</strong>封装了一套SDK，进而优雅地记录操作日志（说人话就是：大佬不想日志写在业务代码上，难以管理。将写日志这个动作抽象出来，用注解来统一记录日志）</p>
<p>文章还是很精彩的，我推荐阅读一遍。</p>
<p>ZhenDong大佬看完文章后，自己实现了一套，已经差不多快要完成了。顺便我跟他讨论了下使用场景，感觉我的项目也可以用那一套东西（<strong>有优雅的打日志方式，谁不爱呢</strong>）</p>
<p>我已经预定了，到时候他给我发源码，我就学习下实现思路（后面项目也用他提供的SDK来打日志，有问题就开喷🐶[狗头.jpg]）。等他忙完写好文章，我也转载下跟大家一起学习下。</p>
<p><img src="https://tva1.sinaimg.cn/large/008i3skNgy1gw28l5kk2ij30tg1hedkj.jpg"></p>
<p>像这种轮子或者说是经验思路，自己学会了以后，就可以在面试的时候吹了。就说自己对项目系统改造了一把，从原来的破鬼样(<strong>介绍背景)<strong>，变成现在如此优雅(<strong>得到的结果</strong>)，并这个过程中穿插自己的实现思路以及遇到的坑(<strong>艰辛的过程</strong>)，这种亮点</strong>哪个面试官又不爱呢</strong>？</p>
<h2 id="08、总结"><a href="#08、总结" class="headerlink" title="08、总结"></a>08、总结</h2><p>日志在一个项目里，我认为是在一个比较重要的位置上的。我们的数据和定位问题都离不开日志，有的项目的日志相当混乱，那维护起来就特别特别麻烦。</p>
<p>其实我完全可以自己写个<code>logback</code>配置就把这块给忽略了，但我还是坚持梳理出来，这篇文章按照「项目」的维度从头梳理了一遍日志的知识，希望对大家有帮助吧。</p>
<p>Gitee链接：<a target="_blank" rel="noopener" href="https://gitee.com/zhongfucheng/austin">https://gitee.com/zhongfucheng/austin</a></p>
<p>GitHub链接：<a target="_blank" rel="noopener" href="https://github.com/ZhongFuCheng3y/austin">https://github.com/ZhongFuCheng3y/austin</a></p>

</div>


    <div class="post-guide">
        <div class="item left">
            
              <a href="/luffy/2021/11/01/12-austin%E9%A1%B9%E7%9B%AE/00.%E9%A1%B9%E7%9B%AE%E4%BB%8B%E7%BB%8D/">
                  <i class="fa fa-angle-left" aria-hidden="true"></i>
                  00.项目介绍
              </a>
            
        </div>
        <div class="item right">
            
              <a href="/luffy/2021/10/30/12-austin%E9%A1%B9%E7%9B%AE/01.%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/">
                01.环境搭建
                <i class="fa fa-angle-right" aria-hidden="true"></i>
              </a>
            
        </div>
    </div>




<script>
	
	
</script>
	</div>
	<button id="totop-toggle" class="toggle"><i class="fa fa-angle-double-up" aria-hidden="true"></i></button>
</body>
</html>
